package org.foreveross.que.secret;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.PBEParameterSpec;

import org.apache.commons.lang3.StringUtils;
/**
 * 字符串加密
 * @author lyq
 *
 */
public class SecretEncrypt {

	/**
	 * 加密字符串
	 * @param key 要加密字符串密钥
	 * @param str 要加密字符串
	 * @return
	 * @throws Exception
	 */
	public static String encrypt(String key,String str) throws Exception { 
	    if(str==null||str.trim().equals("")){
	    	return "";
	    }
		//实例化工具 
	    Cipher cipher=Cipher.getInstance("PBEWithMD5AndDES"); 
	     
	    //使用该工具将基于密码的形式生成Key 
	    SecretKey secretKey=SecretKeyFactory.getInstance("PBEWithMD5AndDES").generateSecret(new PBEKeySpec(key.toCharArray())); 
	    PBEParameterSpec parameterspec=new PBEParameterSpec(new byte[]{1,2,3,4,5,6,7,8},1000); 
	     
	    //初始化加密操作，同时传递加密的算法 
	    cipher.init(Cipher.ENCRYPT_MODE,secretKey,parameterspec); 
	     
	     //将要加密的数据传递进去，返回加密后的数据 
	    byte [] results = cipher.doFinal(str.getBytes("UTF-8")); 
	    String keyword = new String(byteArr2HexStr(results));
	   return keyword;
	} 
	
	/**  
	   * 将byte数组转换为表示16进制值的字符串， 如：byte[]{8,18}转换为：0813， 和public static byte[]  
	   * hexStr2ByteArr(String strIn) 互为可逆的转换过程  
	   *   
	   * @param arrB  
	   *            需要转换的byte数组  
	   * @return 转换后的字符串  
	   * @throws Exception  
	   *             本方法不处理任何异常，所有异常全部抛出  
	   */
	private static String byteArr2HexStr(byte[] arrB) throws Exception {
	    int iLen = arrB.length;
	    // 每个byte用两个字符才能表示，所以字符串的长度是数组长度的两倍   
	    StringBuffer sb = new StringBuffer(iLen * 2);
	    for (int i = 0; i < iLen; i++) {
	      int intTmp = arrB[i];
	      // 把负数转换为正数   
	      while (intTmp < 0) {
	        intTmp = intTmp + 256;
	      }
	      // 小于0F的数需要在前面补0   
	      if (intTmp < 16) {
	        sb.append("0");
	      }
	      sb.append(Integer.toString(intTmp, 16));
	    }
	    return sb.toString();
	  }
}
